package com.oldbook.manage.service.impl;

import com.oldbook.common.exception.ServiceException;
import com.oldbook.common.utils.DateUtils;
import com.oldbook.manage.domain.Textbook;
import com.oldbook.manage.domain.vo.TextbookVO;
import com.oldbook.manage.mapper.TextbookMapper;
import com.oldbook.manage.service.ITextbookService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 教材管理Service业务层处理
 *
 * @author Exiaoke
 * @date 2025-02-17
 */
@Service
@Slf4j
public class TextbookServiceImpl implements ITextbookService
{
    @Autowired(required = false)
    private TextbookMapper textbookMapper;

    /**
     * 查询教材管理
     *
     * @param textbookId 教材管理主键
     * @return 教材管理
     */
    @Override
    public Textbook selectTextbookByTextbookId(Long textbookId)
    {
        return textbookMapper.selectTextbookByTextbookId(textbookId);
    }

    /**
     * 查询教材管理列表
     *
     * @param textbook 教材管理
     * @return 教材管理
     */
    @Override
    public List<TextbookVO> selectTextbookList(Textbook textbook)
    {
        return textbookMapper.selectTextbookList(textbook);
    }

    /**
     * 新增教材管理
     *
     * @param textbook 教材管理
     * @return 结果
     */
    @Override
    public int insertTextbook(Textbook textbook)
    {
        textbook.setCreateTime(DateUtils.getNowDate());
        return textbookMapper.insertTextbook(textbook);
    }

    /**
     * 修改教材管理
     *
     * @param textbook 教材管理
     * @return 结果
     */
    @Override
    public int updateTextbook(Textbook textbook)
    {
        textbook.setUpdateTime(DateUtils.getNowDate());
        return textbookMapper.updateTextbook(textbook);
    }

    /**
     * 批量删除教材管理
     *
     * @param textbookIds 需要删除的教材管理主键
     * @return 结果
     */
    @Override
    public int deleteTextbookByTextbookIds(@Param("textbookIds") Long[] textbookIds)
    {
        return textbookMapper.deleteTextbookByTextbookIds(textbookIds);
    }

    /**
     * 删除教材管理信息
     *
     * @param textbookId 教材管理主键
     * @return 结果
     */
    @Override
    public int deleteTextbookByTextbookId(Long textbookId) {
        return textbookMapper.deleteTextbookByTextbookId(textbookId);
    }


    /**
     * 减库存
     *
     * @param textbookId 教材管理主键
     * @return 结果
     */
    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void deductStock(Long textbookId, Integer num) {
        if (num == null || num <= 0) {
            throw new ServiceException("扣减数量必须大于零");
        }

        // 使用悲观锁确保获取最新数据
        Textbook textbook = textbookMapper.selectByIdForUpdate(textbookId);
        if (textbook == null) {
            throw new ServiceException("教材不存在");
        }

        if (textbook.getStock() < num) {
            throw new ServiceException("库存不足");
        }

        int affectedRows = textbookMapper.deductStockWithVersion(
                textbookId,
                num,
                textbook.getVersion()
        );

        if (affectedRows == 0) {
            throw new ServiceException("操作冲突，请重试");
        }
    }

}
